package com.detech.sbmh.base.annotation;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * 分布式锁注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Lock {

    /**
     * 用于多个方法锁同一把锁 可以理解为锁资源名称 为空则会使用 包名+类名+方法名
     * @return 名称
     */
    String name() default "";

    /**
     * 支持 SPEL expresion 锁的key = name + keys
     * @return KEY
     */
    String[] keys() default "";

    /**
     * 分布式锁key前缀
     */
    String keyPrefix() default "lock";

    /**
     * 获取锁等待时间（默认三秒，还没获取到锁即放弃）
     */
    long waitTime() default 3;

    /**
     * 过期时长，防止一直占用锁
     */
    long expire() default 60;

    /**
     * 过期时长单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

    /**
     * 获取锁失败时是否抛出异常（LockException）
     */
    boolean throwError() default true;

    /**
     * 抛出异常的提示信息
     */
    String failMsg() default "系统繁忙，请稍后再试";

    /**
     * 是否打印获取锁失败的日志
     */
    boolean print() default false;

}
